package com.反射Reflection.API;


import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.TypeVariable;
import java.util.ArrayList;
import java.util.Arrays;

public class API2 {
    /// 修饰符 + 返回值类型 + 参数类型列表
    public static void main(String[] args) throws Exception {
        String str = "com.反射Reflection.API.B";
        //得到类对象
        Class<?> bClass = Class.forName(str);

        /**
         * 1.  getModifiers() 方法.getModifiers()   属性.getModifiers()   构造器.getModifiers()
         *     返回成员的 修饰符值 默认 = 0  public = 1  private = 2  protected = 4 static = 8 final = 16
         *     如果 一个属性是 public static final int ni;  这个属性返回的修饰符值是 1+8+16 = 25
         * 2.  方法.getReturnType  返回 返回值类型属于的Class类型
         * 3.  变量.getType  返回 变量类型属于的Class类型
         * 4.  getParameterTypes(); 获取 方法 或 构造器 的形参类型列表
         */


        System.out.println("---属性 ----默认 = 0  public = 1  private = 2  protected = 4------------------------------------");
        Field[] fields = bClass.getDeclaredFields();
        for (Field field : fields) {
            System.out.println("属性 " + field.getName() + "的修饰符值是 " + field.getModifiers() + " 类型是 " + field.getType());
        }

        System.out.println("\n\n---方法  ----默认 = 0  public = 1  private = 2  protected = 4------------------------------------");
        Method[] methods = bClass.getDeclaredMethods();
        for (Method method : methods) {
            System.out.println("方法 " + method.getName() + "的 修饰符值是 " + method.getModifiers() + " 返回类型是 =" + method.getReturnType());
            Class<?>[] types = method.getParameterTypes();
            if (types.length != 0)
                System.out.println("    方法 " + method.getName() + "的形参有 " + Arrays.toString(types));

        }

        System.out.println("\n\n--------构造器------------------------------------------");
        Constructor<?>[] constructors = bClass.getDeclaredConstructors();
        for (Constructor<?> constructor : constructors) {
            System.out.println("构造器 " + constructor.getName() + "的 修饰符值是 " + constructor.getModifiers());
            Class<?>[] parameterTypes = constructor.getParameterTypes();
            if (parameterTypes.length != 0)
                System.out.println("    " + constructor.getName() + " 的形参列表为 " + Arrays.toString(parameterTypes));
        }
    }
}
